]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
st-label: Keep labels fully pre-rendered on the GPU
authorDaniel van Vugt <daniel.van.vugt@canonical.com>
Wed, 24 Jun 2020 08:00:17 +0000 (16:00 +0800)
committerFlorian Müllner <florian.muellner@gmail.com>
Thu, 25 Jun 2020 09:09:36 +0000 (09:09 +0000)
The performance of the icon grid was being hindered by a large number
of primitives (a few hundred) being copied from the CPU to the GPU on
each frame. This was first noticed in mutter#971 but we failed to
investigate all the issues at the time.

You can also see the high number using `COGL_DEBUG=batching` or
`COGL_DEBUG=disable-texturing`. So now it's obvious that high number is
every letter of every label being uploaded as a separate quad. Let's not
do that and instead treat the whole label as a single quad/texture.

Measured performance on an i7-7700 at UHD 3840x2160:

Journal entries per frame on the icon grid:
 * Before: 288 (18 KB copied from CPU to GPU)
 * After:   73 ( 4 KB copied from CPU to GPU)

Spring animation:
 * Before: 20-30 FPS, avg 22/peak 45 milliseconds per frame
 * After:  30-40 FPS, avg 14/peak 28 milliseconds per frame

Scrolling the icon grid:
 * Before: 15 FPS, 50 milliseconds per frame
 * After:  30 FPS, 28 milliseconds per frame

https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1329

src/st/st-label.c

index e09b1b0c7cb71cf87c75e2cd2b686269de2b4f7f..7415dec29ceff071b656ec3303073d81928e0cbe 100644 (file)
@@ -293,6 +293,7 @@ st_label_class_init (StLabelClass *klass)
 static void
 st_label_init (StLabel *label)
 {
+  ClutterActor *actor = CLUTTER_ACTOR (label);
   StLabelPrivate *priv;
 
   label->priv = priv = st_label_get_instance_private (label);
@@ -304,7 +305,10 @@ st_label_init (StLabel *label)
   label->priv->shadow_width = -1.;
   label->priv->shadow_height = -1.;
 
-  clutter_actor_add_child (CLUTTER_ACTOR (label), priv->label);
+  clutter_actor_add_child (actor, priv->label);
+
+  clutter_actor_set_offscreen_redirect (actor,
+                                        CLUTTER_OFFSCREEN_REDIRECT_ALWAYS);
 }
 
 /**